# -*- coding: utf-8 -*-

#   Copyright (C) 2011  P.L. Lucas
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.


# Synchronize contents of two directories

import os, sys
import os.path
import filecmp
from stat import *

if len(sys.argv)<3 or sys.argv[1]=='--help':
	print """
	Lista los comandos necesarios para sincronizar dos directorios por svn.
	
	python sync.py directorio_origen directorio_destino
	"""
	exit(0)


def list_files(path, solamente_dirs_ok=False):
	l=[]
	for f in os.listdir(path):
		pathname = os.path.join(path, f)
		mode = os.stat(pathname)[ST_MODE]
		if S_ISDIR(mode):
			# It's a directory, recurse into it
			a=list_files(pathname, solamente_dirs_ok)
			if solamente_dirs_ok:
				l.append(pathname)
			for x in a:
				l.append(x)
		elif not solamente_dirs_ok:
		    # It's a file
		    l.append(pathname)
	return l

def trim_path(lista, path):
	l=[]
	for x in lista:
		l.append(os.path.relpath(x, path))
	l.sort()
	return l

def trim_svn(lista):
	l=[]
	for x in lista:
		if x.find('.svn')==-1:
			l.append(x)
	l.sort()
	return l


def diff(archivo1, archivo2):
	f1=open(archivo1,'r')
	f2=open(archivo2,'r')
	ok=False
	if f1.read()!=f2.read():
		ok=True
	f1.close()
	f2.close()
	return ok

origen=sys.argv[1]
destino=sys.argv[2]

#Se cambia al directorio destino

print
print 'cd "'+destino+'"'
print

###############################################
#Se buscan los directorios nuevos y borrados

origen_dirs=list_files(origen, True)
origen_dirs=trim_path(origen_dirs, origen)
origen_dirs=trim_svn(origen_dirs)

destino_dirs=list_files(destino, True)
destino_dirs=trim_path(destino_dirs, destino)
destino_dirs=trim_svn(destino_dirs)

#Directorios nuevos
nuevos_dirs=[]
for x in origen_dirs:
	if not x in destino_dirs:
		nuevos_dirs.append(x)

#Directorios borrados
borrados_dirs=[]
for x in destino_dirs:
	if not x in origen_dirs:
		borrados_dirs.append(x)

print '#Directorios nuevos'
for x in nuevos_dirs:
	print 'mkdir -p "{0}"'.format(x)
	print 'svn add "{0}"'.format(x)
print '#Directorios borrados'
for x in borrados_dirs:
	print 'svn delete "{0}"'.format(x)
print
	
##################################################
#Se buscan los archivos nuevos, borrados o modificados


origen_files=list_files(origen)
origen_files=trim_path(origen_files, origen)
destino_files=list_files(destino)
destino_files=trim_path(destino_files, destino)
destino_files=trim_svn(destino_files)
[coincidencias, mismatch, nuevos]=filecmp.cmpfiles(origen, destino, origen_files)
#print 'Coincidencias: '
#print coincidencias
#print 'Sin comparar: '
#print mismatch
#print 'Nuevos: '
#print nuevos
[match, cambiados, borrados]=filecmp.cmpfiles(destino, origen, destino_files)
#print
#print 'Coincidencias: '
#print match
#print 'Nuevos: '
#print cambiados
#print 'Borrados: '
#print borrados
#print destino_files

# coincidencias, nuevos, borrados
print

print '#Archivos cambiados'
for x in cambiados:
	#print 'Cambiado '+x
	print 'cp "'+origen+'/'+x+'" "'+destino+'/'+x+'"'

print
print '#Archivos nuevos'
for x in nuevos:
	print 'cp "'+origen+'/'+x+'" "'+destino+'/'+x+'"'
	print 'svn add "{0}"'.format(x)

print
print '#Archivos borrados'
for x in borrados:
	print 'svn delete "{0}"'.format(x)

print
